package com.yixin.ystartlibrary.utils;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.util.ArrayList;

/**
 * User: Luozi
 * Date: 2015-07-17
 * Content:
 */
public class JsonUtils {

    /**
     * 根据key值从json获取对应的数据.
     *
     * @param jsonStr json Object数据
     * @param key     键值
     * @return
     */
    public static JsonObject getJsonObject(String jsonStr, String key) {
        return getJsonElement(jsonStr, key).getAsJsonObject();
    }

    /**
     * 根据key值从json获取对应的数据.
     *
     * @param jsonStr json Object数据
     * @param key     键值
     * @return
     */
    public static JsonArray getJsonArray(String jsonStr, String key) {
        return getJsonElement(jsonStr, key).getAsJsonArray();
    }

    /**
     * 根据key值从json获取对应的数据.
     *
     * @param jsonStr json Object数据
     * @param key     键值
     * @return
     */
    public static String getString(String jsonStr, String key) {
        return getJsonElement(jsonStr, key).getAsString();
    }

    /**
     * 根据key值从json获取对应的数据.
     *
     * @param jsonStr json Object数据
     * @param key     键值
     * @return
     */
    public static int getInt(String jsonStr, String key) {
        return getJsonElement(jsonStr, key).getAsInt();
    }

    /**
     * 根据key值从json获取对应的数据.
     *
     * @param jsonStr json Object数据
     * @param key     键值
     * @return
     */
    public static float getFloat(String jsonStr, String key) {
        return getJsonElement(jsonStr, key).getAsFloat();
    }

    /**
     * 根据key值从json获取对应的数据.
     *
     * @param jsonStr json Object数据
     * @param key     键值
     * @return
     */
    public static JsonElement getJsonElement(String jsonStr, String key) {
        JsonParser parser = new JsonParser();
        JsonObject jsonObject = parser.parse(jsonStr).getAsJsonObject();
        return jsonObject.get(key);
    }

    /**
     * 绑定json object数据到class,并且返回该class对象,不转换没有 @Expose 注解的字段.
     *
     * @param jsonStr json Object数据
     * @param cls     绑定class
     * @param <T>     对象
     * @return
     */
    public static <T> T getModel(String jsonStr, Class<T> cls) {
        Gson gson = new Gson();
        T t = gson.fromJson(jsonStr, cls);
        return t;
    }

    /**
     * 绑定json object数据到class,并且返回该class对象,不转换没有 @Expose 注解的字段.
     *
     * @param jsonStr json Object数据
     * @param cls     绑定class
     * @param <T>     对象
     * @return
     */
    public static <T> T getModel(JsonObject jsonStr, Class<T> cls) {
        Gson gson = new Gson();
        T t = gson.fromJson(jsonStr, cls);
        return t;
    }

    /**
     * 绑定json array数据到class,并且返回该class集合对象.
     *
     * @param jsonArrayStr json array数据
     * @param <T>          对象
     */
    public static <T> ArrayList<T> getListModel(String jsonArrayStr, Class<T> cls) {
        JsonParser parser = new JsonParser();
        JsonArray jsonArray = parser.parse(jsonArrayStr).getAsJsonArray();
        Gson gson = new Gson();
        ArrayList<T> arrayList = new ArrayList<>();
        for (int index = 0; index < jsonArray.size(); index++) {
            JsonElement element = jsonArray.get(index);
            T t = gson.fromJson(element, cls);
            arrayList.add(t);
        }
        return arrayList;
    }

    /**
     * 绑定json array数据到class,并且返回该class集合对象.
     *
     * @param jsonArray json array数据
     * @param <T>       对象
     */
    public static <T> ArrayList<T> getListModel(JsonArray jsonArray, Class<T> cls) {
        Gson gson = new Gson();
        ArrayList<T> arrayList = new ArrayList<>();
        for (int index = 0; index < jsonArray.size(); index++) {
            JsonElement element = jsonArray.get(index);
            try {
                T t = gson.fromJson(element, cls);
                arrayList.add(t);
            } catch (Exception e) {
//                e.printStackTrace();
                LogUtils.e("数据格式出现错误===========================================================");
                continue;
            }

        }
        return arrayList;
    }
}
